home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1035 / 1035.xpi / chrome / 1clickweather.jar / content / 1clickweather / js / 1clickweather.js next >
Text File  |  2010-01-08  |  18KB  |  605 lines

  1. // ∩┐╜ 2005 The Weather Channel Interactive, Inc.  All Rights Reserved.
  2.  
  3. // This is the main javascript source file
  4.  
  5. /*
  6.  * The ToolbarContainers hash holds objects that represent each statusbar panel.
  7.  * The key to the hash is the name of a oPanel object.  The hash is created by
  8.  * looping through the array of oPanel objects creating a new ToolbarContainers
  9.  * entry for each object.  The order of the panels is dictated by the order of
  10.  * the oPanel objects defined in the panel.js file.
  11.  *
  12.  */
  13. var ToolbarContainers = {};
  14. var DataContainers = {};
  15.  
  16. var XULSimple = null;
  17. var GlobalError = null;
  18. var GlobalNetworkError = null;
  19. var GlobalToolbarLocation = null;
  20. var GlobalInitFinished = false;
  21. var GlobalInitTime = now();
  22. var GlobalDisablePopup = false;
  23. var GlobalConfigObserver = null;
  24. var GlobalWindow = null;  
  25. var extensionUninstalled = false;
  26.  
  27. // TODO: Get this value from config
  28.  
  29. // The next code catch the item-uninstalled data from em-action-requested
  30. const MY_EXTENSION_UUID = "{DCBD1271-D228-4082-9FBC-36D9B7660B03}";
  31. function initializeOverlay(){
  32.     UninstallObserver.register();
  33. }
  34. var UninstallObserver = {
  35.     /* this script was get */
  36.     _uninstall : false,
  37.     observe: function(subject, topic, data){
  38.         if (topic == "em-action-requested") {
  39.             subject.QueryInterface(Components.interfaces.nsIUpdateItem);
  40.             
  41.             if (subject.id == MY_EXTENSION_UUID) {
  42.                 if (data == "item-uninstalled") {
  43.                     this._uninstall = true;
  44.                     extensionUninstalled = true;
  45.                 }
  46.                 else if (data == "item-cancel-action") {
  47.                     this._uninstall = false;
  48.                     extensionUninstalled = false;
  49.                     
  50.                     var track= new weather_trackingSystem();
  51.                     track.sendAnalyticusTag(5); // Enabled ??
  52.                 }
  53.                 else if(data == "item-disabled"){
  54.                     var track= new weather_trackingSystem();
  55.                     track.sendAnalyticusTag(4); // Disabled
  56.                     
  57.                     this._uninstall = false;
  58.                     extensionUninstalled = false;
  59.                 }
  60.             }        
  61.         }
  62.         // Uninstall tag throw from here to grant quit application
  63.         // avoiding disable action
  64.         //else if (topic == "item-uninstalled") {
  65.         else if(topic == "quit-application-granted") {
  66.             //alert("goodby with: " + this._uninstall);
  67.             this.unregister();
  68.         }
  69.     },
  70.     register:function(){
  71.         var observerservice = Components.classes["@mozilla.org/observer-service;1"].
  72.             getService(Components.interfaces.nsIObserverService);
  73.             
  74.         observerservice.addObserver(this,"em-action-requested",false);
  75.         observerservice.addObserver(this,"item-uninstalled",false);
  76.     },
  77.     
  78.     unregister:function(){
  79.         var observerservice = Components.classes["@mozilla.org/observer-service;1"].
  80.             getService(Components.interfaces.nsIObserverService);
  81.             
  82.             observerservice.removeObserver(this,"em-action-requested");
  83.             observerservice.removeObserver(this,"item-uninstalled");
  84.     }
  85. }
  86.  
  87.  
  88. function goShutdown() {
  89.  
  90.     if(this.extensionUninstalled){
  91.         var track= new weather_trackingSystem();
  92.         track.sendAnalyticusTag(3); // Uninstall
  93.     }
  94. }
  95.  
  96. // XXX bclary
  97. var GlobalInitCount = 0;
  98.  
  99. // this is effectivly our 'main()' function that starts up everything
  100. function goInit() {
  101.     
  102.     if(GlobalInitFinished){
  103.         return false;
  104.        }
  105.    
  106.        // XXX bclary
  107.        // TODO: Review this.
  108.        // Increment GlobalInitCount calling goInit if the first time
  109.        ++GlobalInitCount;
  110.    
  111.        if(GlobalInitCount == 1){
  112.         setTimeout(goInit,500);
  113.           return false;
  114.        } 
  115.    
  116.        jsInclude("chrome://1clickweather/content/js/utils/definitions.js");
  117.        jsInclude("chrome://1clickweather/content/js/utils/xul.js");
  118.        jsInclude("chrome://1clickweather/content/js/utils/errorhandler.js");
  119.        jsInclude("chrome://1clickweather/content/js/utils/appconstants.js");
  120.        jsInclude("chrome://1clickweather/content/js/utils/datadumper.js");
  121.        jsInclude("chrome://1clickweather/content/js/utils/configupdateobserver.js");
  122.        jsInclude("chrome://1clickweather/content/js/utils/network.js");
  123.        jsInclude("chrome://1clickweather/content/js/config/loadconfig.js");
  124.        jsInclude("chrome://1clickweather/content/js/trackingsystem.js");
  125.    
  126.        // load up data javascript
  127.        jsInclude("chrome://1clickweather/content/js/data/datasource.js");
  128.        jsInclude("chrome://1clickweather/content/js/data/panel.js");
  129.  
  130.     /* This is the block 1*/
  131.     try{
  132.         GlobalWindow = window;
  133.         XULSimple = new oXULSimple;
  134.         GlobalError = new oErrorHandler;
  135.         GlobalNetworkError = new oNetworkErrorHandler;
  136.         
  137.        }catch(e){
  138.         alert(e);
  139.        }
  140.  
  141.     /* Block 2*/
  142.     // create an observer to listen for config changes
  143.     try {
  144.         GlobalConfigObserver = new ConfigUpdateObserver();
  145.           GlobalConfigObserver.setFunction(userConfigUpdate);
  146.           GlobalConfigObserver.register();
  147.        }catch(e) {
  148.         debug("config update ocreatebserver: " + e);
  149.        }
  150.  
  151.  
  152.     /* Block 3*/
  153.     try {
  154.         var d = new ConfigUpdateObserver("debugupdate");
  155.           d.setFunction(createDebugPanel);
  156.           d.register();
  157.        }catch(e) {
  158.         debug("debug observer: " + e);
  159.        }
  160.  
  161.  
  162.     /* Block 4 */
  163.     try{
  164.         jsInclude("chrome://1clickweather/content/js/data/search.js");
  165.           loadSearch();
  166.        }catch(e){
  167.         debug("error init search: " + e);
  168.        }
  169.  
  170.     try{
  171.         // fire up the config system.
  172.         // loadconfig.js can be included where ever you need access to config variables.
  173.         // it will pop GlobalUserConfig and GlobalAppConfig into existance
  174.  
  175.         // the first thing we do with the config is find the location we should put things in the browser
  176.         GlobalToolbarLocation = ToolbarLocations[GlobalUserConfig.getAllProfiles().getDefaultProfile().getSetup().getPosition()];
  177.       
  178.         if(GlobalToolbarLocation == "undefined"){
  179.             GlobalToolbarLocation = ToolbarLocations["StatusBar"];
  180.         }
  181.    }catch(e){
  182.       debug("error loading config: " + e);
  183.    }
  184.  
  185.     // first, we loop through the datasource objects making them as we go
  186.     for(var i in oDataSources){
  187.         if (i == "Fcst" || i == "Obs")
  188.             DataContainers[i] = window[i];
  189.         else    
  190.             DataContainers[i] = create_class("oDataSources." + i);
  191.         var tmpId = DataContainers[i].Id(i);
  192.        }
  193.  
  194.     // ok, we loop through the panel object array making new panels
  195.     /*   
  196.        for(var i in oPanel){
  197.     */
  198.     for(i in oPanel){
  199.         if (i == "Fcst" || i == "Obs")
  200.             ToolbarContainers[i] = window[i];
  201.         else
  202.             ToolbarContainers[i] = create_class("oPanel." + i);
  203.     
  204.         
  205.         var tmpInit = ToolbarContainers[i].init(i);
  206.     }
  207.     
  208.     //**-- We show the toolbar location, because it can be hidden!
  209.     if(document.getElementById(GlobalToolbarLocation).hidden)
  210.             document.getElementById(GlobalToolbarLocation).hidden = false;    
  211.  
  212.     // if this is the initial setup, fire up the config system
  213.     // get unique user id from weather unique id service
  214.     if(GlobalUserConfig.getInfo().getIsInitial() == "true"){
  215.         
  216.         // call getUniqueUserId to get user id from weather servers
  217.           var track = new weather_trackingSystem();
  218.           track.getUniqueUserId();
  219.         
  220.         // re prevent any popups from happening when we reconfig the system
  221.         GlobalInitFinished = false;
  222.         
  223.         // open setup dialog
  224.         callSetup(true);
  225.     }
  226.     else
  227.     { 
  228.  
  229.     
  230.         // otherwise, just show everything as normal
  231.         configIcons();
  232.         setupCC();
  233.         setupFcst();
  234.         setupSWA();
  235.     }
  236. }
  237.  
  238. // we work our way through the icons in the options panel hiding or showing them based on the config
  239. function configIcons(){
  240.     
  241.     try{
  242.         debug('changing icons');
  243.           if(GlobalUserConfig.getAllProfiles().getDefaultProfile().getLifeStyle().getIsEnabled() == "true"){
  244.             // ToolbarContainers['Options'].ShowIcon('lifestyle');
  245.             ToolbarContainers['Options'].ShowIcon('hourbyhour');
  246.             ToolbarContainers['Options'].ShowIcon('tendayfcst');
  247.          }else{
  248.             // ToolbarContainers['Options'].HideIcon('lifestyle');
  249.              ToolbarContainers['Options'].HideIcon('hourbyhour');
  250.             ToolbarContainers['Options'].HideIcon('tendayfcst');
  251.  
  252.         }
  253.  
  254.         if(GlobalUserConfig.getAllProfiles().getDefaultProfile().getRadar().getIsEnabled() == "true"){
  255.             ToolbarContainers['Options'].ShowIcon('radar');
  256.             
  257.             
  258.             // Set image url to reflect the user selection
  259.             setRadarImageUrl();
  260.             
  261.     
  262.           }else{
  263.             ToolbarContainers['Options'].HideIcon('radar');
  264.           }
  265.  
  266.           if(GlobalUserConfig.getAllProfiles().getDefaultProfile().getSatelite().getIsEnabled() == "true"){
  267.             ToolbarContainers['Options'].ShowIcon('satellite');
  268.             
  269.             // Set image url to reflect the user selection
  270.             setSatelliteImageUrl();
  271.           }else{
  272.             ToolbarContainers['Options'].HideIcon('satellite');
  273.           }
  274.  
  275.           if(GlobalUserConfig.getAllProfiles().getDefaultProfile().getVideo().getIsEnabled() == "true"){
  276.             ToolbarContainers['Options'].ShowIcon('video');
  277.           }else{
  278.             ToolbarContainers['Options'].HideIcon('video');
  279.           }
  280.     }catch(e){
  281.         debug("show/hide icons: " + e);
  282.        }
  283. }
  284.  
  285. /* setupCC */
  286. function setupCC(){
  287.        if(typeof(DataContainers['Obs']) == "object"){
  288.         var dataUrl = "";
  289.         
  290.         try {
  291.             var configUtils = new ConfigUtils();
  292.              dataUrl = configUtils.getUrl(GlobalAppConfig, GlobalUserConfig, "Obs");
  293.           }catch(e){
  294.             debug(e);
  295.           }
  296.         
  297.         /* Set url to Obs and set refresh interval */        
  298.           DataContainers['Obs'].Url(dataUrl);
  299.           DataContainers['Obs'].setInterval(GlobalAppConfig.getDataByName("Obs").getUpdateInterval().getTime());
  300.         
  301.     }else{
  302.         debug("no DataContainers obs");
  303.        }
  304.  
  305.     /* if obs is enabled, update and start */
  306.     if(GlobalUserConfig.getAllProfiles().getDefaultProfile().getCurrentCond().getIsEnabled() == "true"){
  307.         
  308.         DataContainers['Obs'].Update();
  309.         DataContainers['Obs'].Start();
  310.     }
  311. }
  312.  
  313. function deleteCC(){
  314.        ToolbarContainers['CurrentCond'].Hide();
  315.        DataContainers['Obs'].Shutdown();
  316.        delete(DataContainers['Obs']);
  317. }
  318.  
  319. function setupFcst(){
  320.     if(typeof(DataContainers['Fcst']) == "object"){
  321.         var dataUrl = "";
  322.  
  323.     try {
  324.         var configUtils = new ConfigUtils();
  325.         
  326.         dataUrl = configUtils.getUrl(GlobalAppConfig, GlobalUserConfig, "Fcst");
  327.  
  328.     }catch(e){
  329.         debug(e);
  330.     }
  331.  
  332.     DataContainers['Fcst'].Url(dataUrl);    
  333.     DataContainers['Fcst'].setInterval(GlobalAppConfig.getDataByName("Fcst").getUpdateInterval().getTime());
  334.     }else{
  335.         debug("no DataContainers fcst");
  336.        }
  337.  
  338.     /* update and start */
  339.     if((GlobalUserConfig.getAllProfiles().getDefaultProfile().getForecast().getIsEnabled() == "true") ||
  340.         (GlobalUserConfig.getAllProfiles().getDefaultProfile().getExtForecast().getIsEnabled() == "true")){
  341.  
  342.         DataContainers['Fcst'].Update();
  343.           DataContainers['Fcst'].Start();
  344.        }
  345. }
  346.  
  347. function deleteFcst(){
  348.    ToolbarContainers['Day0'].Hide();
  349.    ToolbarContainers['Day1'].Hide();
  350.    ToolbarContainers['Day2'].Hide();
  351.    ToolbarContainers['Day3'].Hide();
  352.    ToolbarContainers['Day4'].Hide();
  353.    DataContainers['Fcst'].Shutdown();
  354.    delete(DataContainers['Fcst']);
  355. }
  356.  
  357. function setupSWA(){
  358.    //alert("setupSwa");
  359.    if(typeof(DataContainers['SWA']) == "object"){
  360.       var dataUrl = "";
  361.       try {
  362.          var configUtils = new ConfigUtils();
  363.          dataUrl = configUtils.getUrl(GlobalAppConfig, GlobalUserConfig, "SWA");
  364.       }catch(e){
  365.          debug(e);
  366.       }
  367.  
  368.       DataContainers['SWA'].Url(dataUrl);
  369.       // setup the scheduler to run severe weather calls based on the interval in minutes in the config      
  370.       DataContainers['SWA'].setInterval(GlobalUserConfig.getAllProfiles().getDefaultProfile().getCurrentCond().getAlerts().getInterval());
  371.    }else{
  372.       debug("no DataContainers swa");
  373.    }
  374.  
  375.    if(GlobalUserConfig.getAllProfiles().getDefaultProfile().getCurrentCond().getAlerts().getIsEnabled() == "true"){
  376.       DataContainers['SWA'].Update();
  377.       DataContainers['SWA'].Start();      
  378.       setTimeout(setGlobalInitFinished, 3500);
  379.    }
  380. }
  381. function deleteSWA(){
  382.    ToolbarContainers['SWA'].Hide();
  383.    DataContainers['SWA'].Shutdown();
  384.    delete(DataContainers['SWA']);
  385. }
  386.  
  387. // when we get a message from the config screen, we delete then recreate everything
  388. function userConfigUpdate(subject, topic, data){
  389.    debugLog("reconfigure due to save");
  390.    // re prevent any popups from happening when we reconfig the system
  391.    GlobalInitFinished = false;
  392.    try{
  393.       deleteCC();
  394.       deleteFcst();
  395.       deleteSWA();
  396.    }catch(e){
  397.       debugLog("error doing initial deletes: " + e);
  398.    }
  399.  
  400.    try{
  401.       var cfgManager = new ConfigManager();
  402.       tmpUserCfg = new cfgManager.getUserConfig();
  403.       delete(GlobalUserConfig);
  404.      
  405.       GlobalUserConfig = tmpUserCfg;
  406.  
  407.       // the first thing we do with the config is find the location we should put things in the browser
  408.       GlobalToolbarLocation = ToolbarLocations[GlobalUserConfig.getAllProfiles().getDefaultProfile().getSetup().getPosition()];
  409.       if(GlobalToolbarLocation == "undefined"){
  410.          GlobalToolbarLocation = ToolbarLocations["StatusBar"];
  411.       }
  412.       
  413.    DataContainers = {};
  414.    // first, we loop through the datasource objects making them as we go
  415.    for(var i in oDataSources){      
  416.       if (i == "Fcst" || i == "Obs")
  417.             DataContainers[i] = window[i];
  418.        else
  419.             DataContainers[i] = create_class("oDataSources." + i);
  420.       var tmpId = DataContainers[i].Id(i);
  421.    }
  422.  
  423.    }catch(e){
  424.       debugLog("error reloading user data: " + e);
  425.    }
  426.  
  427.  
  428.    ToolbarContainers['SWA'].moveToolbar();
  429.    ToolbarContainers['Options'].moveToolbar();
  430.    ToolbarContainers['CurrentCond'].moveToolbar();
  431.    ToolbarContainers['Day0'].moveToolbar();
  432.    ToolbarContainers['Day1'].moveToolbar();
  433.    ToolbarContainers['Day2'].moveToolbar();
  434.    ToolbarContainers['Day3'].moveToolbar();
  435.    ToolbarContainers['Day4'].moveToolbar();
  436.  
  437.    // update icons in the options panel
  438.    var ccc = configIcons();
  439.  
  440.    setTimeout(runDataConfig, 1000);
  441.    
  442.    debugLog("done with reconfigure");
  443.    //alert("Notice:\n\nYour 1-ClickWeather settings have been saved!\n\nThank You.\n\n");
  444.  
  445.    // we wait for a few seconds before we turn on the already initialized flag
  446.    // that way, we don't show tooltips right off
  447.    setTimeout(setGlobalInitFinished, 4000);
  448.    return true;
  449. }
  450.  
  451.  
  452. function create_class(class) {    
  453.     return new Function('return new ' + class)();
  454. };
  455.  
  456. function setGlobalInitFinished(){
  457.     GlobalInitFinished = true;
  458. }
  459.  
  460. function runDataConfig() {
  461.     // update icons in the options panel
  462.    var ccc = configIcons();
  463.      try{
  464.     //  deleteCC();
  465.       setupCC();
  466.      // deleteFcst();
  467.       setupFcst();
  468.      // deleteSWA();
  469.       setupSWA();    
  470.    }catch(e){
  471.       debugLog("error doing initial setups: " + e);
  472.    }
  473. }
  474.  
  475. /* callSetup methods */
  476. function callSetup(initial){
  477.  
  478.     var networkError = false;
  479.     var cz = null;
  480.  
  481.     // default location
  482.     var loc = GlobalUserConfig.getAllProfiles().getDefaultProfile().getSetup().getLocation().getLocID();
  483.     
  484.     /* TODO: Review this code */
  485.     if(loc == "default"){ // if we had to set a default location because it's a new install
  486.     
  487.         loc = "30339"; // default location ??
  488.         networkError = true; // TODO: why this flag is set to true ??
  489.        }
  490.     /* TODO: Review this. Its neccessary*/
  491.     var locStr = GlobalSearch.getLocationData(loc);
  492.  
  493.     if(locStr){
  494.         if(initial){
  495.             cz = openXUL("config.xul","setup","initial");
  496.         }else{
  497.             cz = openXUL("config.xul");
  498.           }
  499.        }else{
  500.       // depending on if we are already configured or if it's a fresh install, show the right popup error
  501.       if(networkError){
  502.          debugLog("network error in callSetup");
  503.          GlobalNetworkError.Show();
  504.       }else{
  505.          debugLog("network error in callSetup at new install");
  506.          GlobalError.Show();
  507.       }
  508.    }
  509. }
  510.  
  511. //***************************************************************
  512. //Image Int∩┐╜l Satellite Maps
  513. function setSatelliteImageUrl(){
  514.     // get radar id
  515.     var rid = GlobalUserConfig.getAllProfiles().getDefaultProfile().getSatelite().getID();
  516.             
  517.     // get radar image reference
  518.     var satelliteImg = document.getElementById("satelliteImage");
  519.             
  520.      var r = "";
  521.     switch(rid){
  522.         case "satelliteEurope":
  523.             r = "http://bd.image.weather.com/images/sat/europesat_277x187.jpg";
  524.             break;
  525.         case "satelliteMiddleEast":
  526.             r = "http://bd.image.weather.com/images/sat/mideastsat_277x187.jpg";
  527.             break;
  528.         case "satelliteMexico":
  529.             r = "http://bd.image.weather.com/images/sat/mexsat_277x187.jpg";
  530.             break;
  531.         case "satelliteRussia":
  532.             r = "http://bd.image.weather.com/images/sat/russia_sat_277x187.jpg";
  533.             break;
  534.         case "satelliteAfrica":
  535.             r = "http://bd.image.weather.com/images/sat/africasat_277x187.jpg";
  536.             break;
  537.         case "satelliteCentralAmerica":
  538.             r = "http://bd.image.weather.com/images/sat/cenamersat_277x187.jpg";
  539.             break;
  540.         case "satelliteAsia":
  541.             r = "http://bd.image.weather.com/images/sat/asiasat_277x187.jpg";
  542.             break;
  543.         case "satelliteCanada":
  544.             r = "http://bd.image.weather.com/images/sat/canadasat_277x187.jpg";
  545.             break;
  546.         case "satelliteSouthAmerica":
  547.             r = "http://bd.image.weather.com/images/sat/sasat_277x187.jpg";
  548.             break;
  549.                 
  550.     }
  551.  
  552.     // set src attribute to reflect the user selection 
  553.     satelliteImg.setAttribute("src",r);
  554. }
  555.  
  556.  
  557. /* get image url from radar id */
  558. function setRadarImageUrl(){
  559.  
  560.     // get radar id
  561.     var rid = GlobalUserConfig.getAllProfiles().getDefaultProfile().getRadar().getID();
  562.             
  563.     // get radar image reference
  564.     var dopplerImg = document.getElementById("dopplerImage");
  565.             
  566.      var r = "";
  567.     switch(rid){
  568.         
  569.         case "radarNorthwest":
  570.             r = "http://bd.image.weather.com/web/radar/us_nw_9regradar_small_usen.jpg";
  571.             break;
  572.         case "radarNorthcentral":
  573.             r = "http://bd.image.weather.com/web/radar/us_nc_9regradar_small_usen.jpg";
  574.             break;    
  575.         case "radarNortheast":
  576.             r = "http://bd.image.weather.com/web/radar/us_ne_9regradar_small_usen.jpg";
  577.             break;
  578.         case "radarWestcentral":
  579.             r = "http://bd.image.weather.com/web/radar/us_wc_9regradar_small_usen.jpg";
  580.             break;
  581.         case "radarCentral":
  582.             r = "http://bd.image.weather.com/web/radar/us_cn_9regradar_small_usen.jpg";
  583.             break;
  584.         case "radarEastcentral":
  585.             r = "http://bd.image.weather.com/web/radar/us_ec_9regradar_small_usen.jpg";
  586.             break;    
  587.         case "radarSouthwest":
  588.             r = "http://bd.image.weather.com/web/radar/us_sw_9regradar_small_usen.jpg";
  589.             break;
  590.         case "radarSouthcentral":
  591.             r = "http://bd.image.weather.com/web/radar/us_sc_9regradar_small_usen.jpg";
  592.             break;
  593.         case "radarSoutheast":
  594.             r = "http://bd.image.weather.com/web/radar/us_se_9regradar_small_usen.jpg";
  595.             break;    
  596.             
  597.     }
  598.  
  599.     // set src attribute to reflect the user selection 
  600.     dopplerImg.setAttribute("src",r);
  601. }
  602.  
  603.  
  604.  
  605.